const fp = require('lodash/fp')
const { Maybe, Container } = require('./support')
const _ = require('lodash')

/*
  练习1:
  实现函数 ex1
  使用 fp.add(x, y) 和 fp.map(f, x)
  让函子里的值 增加1
*/

// (1)
// map第一个参数执行的回调函数，第二个是数组
getSum = arr => fp.map(v => fp.add(v, 1), arr)

let ex1 = (arr) => {
    // console.log(arr)
    return Container.of(arr)
                    .map (getSum)
                    ._value
}
console.log(ex1([20,1]))

// // (2)

let ex2 = (arr) => {
    return Container.of(arr)
                    .map(fp.first)
                    ._value
}
console.log(ex2([1,2,3]))
// // (3)
/*
  练习3:
  实现 ex3 函数
  使用 safeProp 和 fp.first 找到 user 的名字的首字母
*/
let safeProp = fp.curry(function (x, o) {
    return Maybe.of(o[x])
})
let user = { id: 2, name: 'Albert'}

let ex3 = (n) => {
    return Container.of(n)
                    .map( x => safeProp('name',x).map(fp.first))
}
console.log(ex3(user))

// // (4)
/*
  练习4:
  使用 Maybe 重写 ex4, 不要有 if 语句
  let ex4 = function (n) {
    if (n) {
      return parseInt(n)
    }
  }
  功能描述:
  把参数中数值部分转为整数,并且以函子形式返回
  换言之, 提取字符串里的数字作为返回结果函子的 _value 值
*/

// 1.实现 ex4 函数
// parseInt(n)
let ex4 = (n) => {
    return Maybe.of(n)
                .map(parseInt)
                ._value
}
console.log( ex4('7R') )   // Maybe { _value: 7 }
console.log( ex4('7.6B'))  // Maybe { _value: 7 }
console.log( ex4('8.2G') ) // Maybe { _value: 8 }

console.log( ex4(null) )      // Maybe { _value: null }
console.log( ex4(undefined) ) // Maybe { _value: undefined }

console.log( ex4('i7.5') )    // Maybe { _value: NaN }
console.log( ex4('abc') )     // Maybe { _value: NaN }

